package com.partynetwork.dataprovider.util; import java.io.IOException; import java.util.List; import java.util.Locale; import android.content.Context; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; /** * 描述gps应用,gps定位与网络定位 * @author 沈跃双 * */ public class GPS implements LocationListener{ /** * 上下文,从这里获取gps功能 */ private static Context mContext; /** * 单例对象 */ private static GPS mGps; private static LocationManager mLocationManager; private GPS(OnGpsChangeListener gpsChangeListener){ GPS.mContext = (Context)gpsChangeListener; this.gpsChangeListener = gpsChangeListener; } /** * 单例函数 * @param context * @return */ public static GPS instance(OnGpsChangeListener gpsChangeListener){ GPS.mContext = (Context)gpsChangeListener; if(null == mGps){ mGps = new GPS(gpsChangeListener); } return mGps; } /** * 回调接口 * @author 沈跃双 */ public interface OnGpsChangeListener{ /** * 当知道最后一个gps定位的坐标时回调 * @param location */ void OnLastKnowLocation(GPSData data); /** * 当定位成功时回调 */ void OnLocationChanged(GPSData data); } private OnGpsChangeListener gpsChangeListener; /** * gps数据结构 * @author 沈跃双 */ public class GPSData{ /** * 维度 */ public double latitude; /** * 经度 */ public double longitude; /** * 城市名 */ public String cityName; /** * 具体街道地址 */ public String address; } /** * 开始定位,一次性执行 * 定位成功后,释放对象 */ public void startGPS(){ mLocationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); //得到最后一次获取的精度维度 Location lastKnownLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); //如果记录存在,则封装数据,并回调 if(null != lastKnownLocation){ GPSData data = new GPSData(); data.latitude = lastKnownLocation.getLatitude(); data.longitude = lastKnownLocation.getLongitude(); gpsChangeListener.OnLastKnowLocation(data); } String provider= null; if(mLocationManager.isProviderEnabled("network")){ provider = "network"; }else if(mLocationManager.isProviderEnabled("gps")){ provider = "gps"; }else{ return; } //注册监听 mLocationManager.requestLocationUpdates(provider, 1, 1000f, this); } /** * 当gps经纬度发生变化时调用 */ public void onLocationChanged(Location location) { /* * 获取经度纬度,封装数据 */ GPSData data = new GPSData(); data.latitude = location.getLatitude(); data.longitude = location.getLongitude(); Geocoder gc = new Geocoder(mContext , Locale.getDefault()); /* * 获取本地信息,从中获取城市名 * 并封装数据 */ try { List<Address> addresses = gc.getFromLocation(data.latitude, data.longitude, 1); if(addresses.size() > 0){ Address address = addresses.get(0); data.cityName = address.getLocality(); } } catch (IOException e) { e.printStackTrace(); } gpsChangeListener.OnLocationChanged(data); this.closeGPS(); } public void onProviderDisabled(String provider) { System.out.println("onProviderDisabled"+provider); } public void onProviderEnabled(String provider) { System.out.println("onProviderEnabled"+provider); } public void onStatusChanged(String provider, int status, Bundle extras) { System.out.println("onStatusChanged"); } /** * 关闭gps */ public void closeGPS(){ if(mLocationManager != null){ mLocationManager.removeUpdates(this); mLocationManager = null; } } }